Security News
The Risks of Misguided Research in Supply Chain Security
Snyk's use of malicious npm packages for research raises ethical concerns, highlighting risks in public deployment, data exfiltration, and unauthorized testing.
I2C serial bus access with Node.js on Linux boards like the Raspberry Pi, C.H.I.P., BeagleBone or Intel Edison. All methods have asynchronous and synchronous forms.
i2c-bus supports Node.js versions 0.10, 0.12, 4, 5, 6, 7, 8 and 9.
npm install i2c-bus
The way in which I2C is configured varies from board to board. Sometimes no configuraton is required, but sometimes it is:
Some of the examples programs use a DS1621 temperature sensor to show how the i2c-bus package functions.
DS1621 temperature sensor connected to a Raspberry Pi
DS1621 temperature sensor connected to a BeagleBone Black
Determine the temperature with a DS1621 temperature sensor Synchronously.
var i2c = require('i2c-bus'),
i2c1 = i2c.openSync(1);
var DS1621_ADDR = 0x48,
CMD_ACCESS_CONFIG = 0xac,
CMD_READ_TEMP = 0xaa,
CMD_START_CONVERT = 0xee;
function toCelsius(rawTemp) {
var halfDegrees = ((rawTemp & 0xff) << 1) + (rawTemp >> 15);
if ((halfDegrees & 0x100) === 0) {
return halfDegrees / 2; // Temp +ve
}
return -((~halfDegrees & 0xff) / 2); // Temp -ve
}
(function () {
var rawTemp;
// Enter one shot mode (this is a non volatile setting)
i2c1.writeByteSync(DS1621_ADDR, CMD_ACCESS_CONFIG, 0x01);
// Wait while non volatile memory busy
while (i2c1.readByteSync(DS1621_ADDR, CMD_ACCESS_CONFIG) & 0x10) {
}
// Start temperature conversion
i2c1.sendByteSync(DS1621_ADDR, CMD_START_CONVERT);
// Wait for temperature conversion to complete
while ((i2c1.readByteSync(DS1621_ADDR, CMD_ACCESS_CONFIG) & 0x80) === 0) {
}
// Display temperature
rawTemp = i2c1.readWordSync(DS1621_ADDR, CMD_READ_TEMP);
console.log('temp: ' + toCelsius(rawTemp));
i2c1.closeSync();
}());
Determine the temperature with a DS1621 temperature sensor Asynchronously. Example 2 does exactly the same thing as example 1, but uses the asynchronous rather than the synchronous API.
var async = require('async'),
i2c = require('i2c-bus'),
i2c1;
var DS1621_ADDR = 0x48,
CMD_ACCESS_CONFIG = 0xac,
CMD_READ_TEMP = 0xaa,
CMD_START_CONVERT = 0xee;
function toCelsius(rawTemp) {
var halfDegrees = ((rawTemp & 0xff) << 1) + (rawTemp >> 15);
if ((halfDegrees & 0x100) === 0) {
return halfDegrees / 2; // Temp +ve
}
return -((~halfDegrees & 0xff) / 2); // Temp -ve
}
(function () {
async.series([
function (cb) {
i2c1 = i2c.open(1, cb);
},
function (cb) {
// Enter one shot mode (this is a non volatile setting)
i2c1.writeByte(DS1621_ADDR, CMD_ACCESS_CONFIG, 0x01, cb);
},
function (cb) {
// Wait while non volatile memory busy
(function read() {
i2c1.readByte(DS1621_ADDR, CMD_ACCESS_CONFIG, function (err, config) {
if (err) return cb(err);
if (config & 0x10) return read();
cb(null);
});
}());
},
function (cb) {
// Start temperature conversion
i2c1.sendByte(DS1621_ADDR, CMD_START_CONVERT, cb);
},
function (cb) {
// Wait for temperature conversion to complete
(function read() {
i2c1.readByte(DS1621_ADDR, CMD_ACCESS_CONFIG, function (err, config) {
if (err) return cb(err);
if ((config & 0x80) === 0) return read();
cb(null);
});
}());
},
function (cb) {
// Display temperature
i2c1.readWord(DS1621_ADDR, CMD_READ_TEMP, function (err, rawTemp) {
if (err) return cb(err);
console.log('temp: ' + toCelsius(rawTemp));
cb(null);
});
},
function (cb) {
i2c1.close(cb);
}
], function (err) {
if (err) throw err;
});
}());
This example demonstrates concurrent asynchronous access to two devices on the same bus, a DS1621 temperature sensor and an Adafruit TSL2561 digital luminosity/lux/light sensor.
var i2c = require('i2c-bus'),
i2c1;
var DS1621_ADDR = 0x48,
DS1621_CMD_ACCESS_TH = 0xa1;
var TSL2561_ADDR = 0x39,
TSL2561_CMD = 0x80,
TSL2561_REG_ID = 0x0a;
i2c1 = i2c.open(1, function (err) {
if (err) throw err;
(function readTempHigh() {
i2c1.readWord(DS1621_ADDR, DS1621_CMD_ACCESS_TH, function (err, tempHigh) {
if (err) throw err;
console.log(tempHigh);
readTempHigh();
});
}());
(function readId() {
i2c1.readByte(TSL2561_ADDR, TSL2561_CMD | TSL2561_REG_ID, function (err, id) {
if (err) throw err;
console.log(id);
readId();
});
}());
});
All methods have asynchronous and synchronous forms.
The asynchronous form always take a completion callback as its last argument. The arguments passed to the completion callback depend on the method, but the first argument is always reserved for an exception. If the operation was completed successfully, then the first argument will be null or undefined.
When using the synchronous form any exceptions are immediately thrown. You can use try/catch to handle exceptions or allow them to bubble up.
Free resources
Information
Plain I2C
SMBus
Asynchronous open. Returns a new Bus object. The callback gets one argument (err).
The following options are supported:
Synchronous open. Returns a new Bus object.
The following options are supported:
Asynchronous close. The callback gets one argument (err).
Synchronous close.
Determine functionality of the bus/adapter asynchronously. The callback gets two argument (err, funcs). funcs is a frozen I2cFuncs object describing the functionality available. See also I2C functionality.
Determine functionality of the bus/adapter Synchronously. Returns a frozen I2cFuncs object describing the functionality available. See also I2C functionality.
Scans the I2C bus asynchronously for devices the same way i2cdetect -y -r
would. The callback gets two arguments (err, devices). devices is an array of
numbers where each number represents the I2C address of a device which was
detected.
Scans the I2C bus synchronously for devices the same way i2cdetect -y -r
would. Returns an array of numbers where each number represents the I2C address
of a device which was detected.
Asynchronous plain I2C read. The callback gets three argument (err, bytesRead, buffer). bytesRead is the number of bytes read.
Synchronous plain I2C read. Returns the number of bytes read.
Asynchronous plain I2C write. The callback gets three argument (err, bytesWritten, buffer). bytesWritten is the number of bytes written.
Synchronous plain I2C write. Returns the number of bytes written.
Asynchronous SMBus read byte. The callback gets two arguments (err, byte).
Synchronous SMBus read byte. Returns the byte read.
Asynchronous SMBus read word. The callback gets two arguments (err, word).
Synchronous SMBus read word. Returns the word read.
Asynchronous I2C block read (not defined by the SMBus specification). Reads a block of bytes from a device, from a designated register that is specified by cmd. The callback gets three arguments (err, bytesRead, buffer). bytesRead is the number of bytes read.
Synchronous I2C block read (not defined by the SMBus specification). Reads a block of bytes from a device, from a designated register that is specified by cmd. Returns the number of bytes read.
Asynchronous SMBus receive byte. The callback gets two arguments (err, byte).
Synchronous SMBus receive byte. Returns the byte received.
Asynchronous SMBus send byte. The callback gets one argument (err).
Synchronous SMBus send byte.
Asynchronous SMBus write byte. The callback gets one argument (err).
Synchronous SMBus write byte.
Asynchronous SMBus write word. The callback gets one argument (err).
Synchronous SMBus write word.
Asynchronous SMBus quick command. Writes a single bit to the device. The callback gets one argument (err).
Synchronous SMBus quick command. Writes a single bit to the device.
Asynchronous I2C block write (not defined by the SMBus specification). Writes a block of bytes to a device, to a designated register that is specified by cmd. The callback gets three argument (err, bytesWritten, buffer). bytesWritten is the number of bytes written.
Synchronous I2C block write (not defined by the SMBus specification). Writes a block of bytes to a device, to a designated register that is specified by cmd.
Specifies whether or not the adapter handles plain I2C-level commands (Pure SMBus adapters typically can not do these, I2C_FUNC_I2C).
Specifies whether or not the adapter handles the 10-bit address extensions (I2C_FUNC_10BIT_ADDR).
Specifies whether or not the adapter knows about the I2C_M_IGNORE_NAK, I2C_M_REV_DIR_ADDR and I2C_M_NO_RD_ACK flags (which modify the I2C protocol! I2C_FUNC_PROTOCOL_MANGLING).
Specifies whether or not the adapter handles packet error checking (I2C_FUNC_SMBUS_PEC).
Specifies whether or not the adapter handles the SMBus block process call command (I2C_FUNC_SMBUS_BLOCK_PROC_CALL).
Specifies whether or not the adapter handles the SMBus quick command (I2C_FUNC_SMBUS_QUICK).
Specifies whether or not the adapter handles the SMBus receive byte command (I2C_FUNC_SMBUS_READ_BYTE).
Specifies whether or not the adapter handles the SMBus send byte command (I2C_FUNC_SMBUS_WRITE_BYTE).
Specifies whether or not the adapter handles the SMBus read byte command (I2C_FUNC_SMBUS_READ_BYTE_DATA).
Specifies whether or not the adapter handles the SMBus write byte command (I2C_FUNC_SMBUS_WRITE_BYTE_DATA).
Specifies whether or not the adapter handles the SMBus read word command (I2C_FUNC_SMBUS_READ_WORD_DATA).
Specifies whether or not the adapter handles the SMBus write word command (I2C_FUNC_SMBUS_WRITE_WORD_DATA).
Specifies whether or not the adapter handles the SMBus process call command (I2C_FUNC_SMBUS_PROC_CALL).
Specifies whether or not the adapter handles the SMBus read block command (I2C_FUNC_SMBUS_READ_BLOCK_DATA).
Specifies whether or not the adapter handles the SMBus write block command (I2C_FUNC_SMBUS_WRITE_BLOCK_DATA).
Specifies whether or not the adapter handles the SMBus read I2C block command (I2C_FUNC_SMBUS_READ_I2C_BLOCK).
Specifies whether or not the adapter handles the SMBus write i2c block command (I2C_FUNC_SMBUS_WRITE_I2C_BLOCK).
FAQs
I2C serial bus access with Node.js
The npm package i2c-bus receives a total of 1,535 weekly downloads. As such, i2c-bus popularity was classified as popular.
We found that i2c-bus demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Snyk's use of malicious npm packages for research raises ethical concerns, highlighting risks in public deployment, data exfiltration, and unauthorized testing.
Research
Security News
Socket researchers found several malicious npm packages typosquatting Chalk and Chokidar, targeting Node.js developers with kill switches and data theft.
Security News
pnpm 10 blocks lifecycle scripts by default to improve security, addressing supply chain attack risks but sparking debate over compatibility and workflow changes.